iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

非本科之30天Ruby / Rails學習筆記系列 第 8

Day8: Module的引入include和extend

  • 分享至 

  • xImage
  •  

上次提到了類別(class)與模組(module)的差異,今天針對module如何引入進class使用來特別說明。

比較 模組(module) 類別(class)
繼承inheritance
可實體化instantiation

include

加入模組進入類別使用的時候,一般最常見的就是include,延續之前的例子:

module VolleyTeam
  def set
    puts '舉球'
  end
end

class BasketTeam 
  include VolleyTeam  #將module include到類別裡
  def pass
    puts '接球後,傳球!'
  end
end

sakuragi = BasketTeam.new          #產生sakaragi實體
sakuragi.pass # => 接球後,傳球!
sakuragi.set  # => 舉球!            #module的實體方法     

當一個 class 使用 include 引入 Module 的時候,會將module內的方法在class內增加一個實體方法

extend

如果使用extend加入module模組的話:

module VolleyTeam
  def set
    puts '舉球'
  end
end

class BasketTeam 
  extend VolleyTeam  
  def pass
    puts '接球後,傳球!'
  end
end

sakuragi = BasketTeam.new
sakuragi.pass # => 接球後,傳球!
sakuragi.set  # => 舉球!

會出現error

undefined method `set' for #<BasketTeam:0x00007fc18783eca8>

原因是如果用extend的話,會將module內的方法在class增加為類別方法,所以用實體後面去接類別方法,就會出現錯誤。

因此直接改為類別直接接類別方法就好:

sakuragi = BasketTeam.new
sakuragi.pass   # => 接球後,傳球!
BasketTeam.set  # => 舉球!   #module的類別方法,直接接BasketTeam類別

總結

Include is for adding methods to an instance of a class and extend is for adding class methods.

使用include引入,會將module內的方法在class增加為實體方法
使用extend 引入,會將module內的方法在class增加為類別方法

參考資料:
What is the different between <> and <> in use case diagram?
https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073
Include vs Extend in Ruby
Ruby 的繼承鍊 (2) - Module 的 include、prepend 和 extend

“Ninety percent of all those who fail are not actually defeated. They simply quit.”

— Paul J. Meyer, Motivational Coach

本文同步發佈於: https://louiswuyj.tw/


上一篇
Day7: Ruby裡的self是什麼?
下一篇
Day9: Ruby的三種存取控制Public, Private, Protected
系列文
非本科之30天Ruby / Rails學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言